#include "tcpserver.h"
#include "./ui_tcpserver.h"

TcpServer::TcpServer(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::TcpServer)
{
    ui->setupUi(this);

    ui->le_port->setText("8899");

    // 第一步：创建监听的服务对象
    server_ = new QTcpServer(
        this); // 指定实例化父类this，即QMainWindow，待页面析构时，server_也被析构

    // 第三步：通过 QTcpServer::newConnection()信号检测是否有新的客户端连接
    // 如果有新的客户端连接调用 QTcpSocket *QTcpServer::nextPendingConnection()
    // 得到通信的套接字对象
    connect(server_, &QTcpServer::newConnection, this, [=]() {
        tcp_ = server_->nextPendingConnection();
        ui->txe_record->append("成功和客户端建立了新的连接...");
        status_->setPixmap(QPixmap(":/resources/connect.png").scaled(20, 20));

        // 检测是否有客户端数据
        connect(tcp_, &QTcpSocket::readyRead, this, [=]() {
            // 接收数据
            QByteArray data = tcp_->readAll();
            ui->txe_record->append("客户端Say：" + data);
        });

        // 检测客户端是否断开了连接
        connect(tcp_, &QTcpSocket::disconnected, this, [=]() {
            ui->txe_record->append("客户端已经断开了连接...");
            tcp_->deleteLater();
            status_->setPixmap(
                QPixmap(":/resources/disconnect.png").scaled(20, 20));
        });
    });

    // 设置连接状态的状态栏
    status_ = new QLabel(this);
    status_->setPixmap(QPixmap(":/resources/disconnect.png").scaled(20, 20));
    ui->statusbar->addWidget(new QLabel("连接状态："));
    ui->statusbar->addWidget(status_);
}

TcpServer::~TcpServer()
{
    delete ui;
}

// 第二步：通过 QTcpServer 对象设置监听，即：QTcpServer::listen()
void TcpServer::on_pbn_set_listen_clicked()
{
    unsigned short port = ui->le_port->text().toUShort();
    // 设置服务器监听
    server_->listen(QHostAddress::Any, port);
    ui->pbn_set_listen->setEnabled(false);
}

void TcpServer::on_pbn_send_data_clicked()
{
    // 将txe_send_message中输入内容转为纯文本的QString形式
    QString msg = ui->txe_send_message->toPlainText();
    // 将QSting类型转为QByteArray类型
    tcp_->write(msg.toUtf8());
    ui->txe_record->append("服务端Say：" + msg);
    ui->txe_send_message->clear();
}
